
package v2store

const (
	Get              = "get"
	Create           = "create"
	Set              = "set"
	Update           = "update"
	Delete           = "delete"
	CompareAndSwap   = "compareAndSwap"
	CompareAndDelete = "compareAndDelete"
	Expire           = "expire"
)

// 当v2存储收到调用请求之后，会进行相应的处理，在处理完成之后，
// 会将处理结果及相关信息封装成Event实例返回
type Event struct {
	// 该Event实例对应的操作，可选项有Get、Create、Set、Update、Delete、
	// CompareAndSwap、CompareAndDelete和Expire。
	Action    string      `json:"action"`
	// 当前操作节点对应的Nod巳Extern实例。
	Node      *NodeExtern `json:"node,omitempty"`
	// 如果是更新操作，则记录该节点之前状态对应的Nod巳Extern实例。
	PrevNode  *NodeExtern `json:"prevNode,omitempty"`
	// 记录操作完成之后的Currentlndex值。
	EtcdIndex uint64      `json:"-"`
	// 如果是Set、Update、CompareAndSwap三种涉及值更新的操作，则该字段都有可能被设置true。
	// 当该字段被设置为true时，表示该Event实例对应的修改操作只进行刷新操作（例如，只修改了节点的过期时间），
	// 并没有改变节点的值，不会触发相关的watcher。
	Refresh   bool        `json:"refresh,omitempty"`
}

func newEvent(action string, key string, modifiedIndex, createdIndex uint64) *Event {
	n := &NodeExtern{
		Key:           key,
		ModifiedIndex: modifiedIndex,
		CreatedIndex:  createdIndex,
	}

	return &Event{
		Action: action,
		Node:   n,
	}
}

func (e *Event) IsCreated() bool {
	if e.Action == Create {
		return true
	}
	return e.Action == Set && e.PrevNode == nil
}

func (e *Event) Index() uint64 {
	return e.Node.ModifiedIndex
}

func (e *Event) Clone() *Event {
	return &Event{
		Action:    e.Action,
		EtcdIndex: e.EtcdIndex,
		Node:      e.Node.Clone(),
		PrevNode:  e.PrevNode.Clone(),
	}
}

func (e *Event) SetRefresh() {
	e.Refresh = true
}
